/**
 * prototype
 *
 * 每个函数都有个prototype属性
 * 该属性值是一个对象（属性的集合），默认只有一个constructor属性指向函数本身
 */

function Fn() {
};
Fn.prototype.name = '张三';
Fn.prototype.age = 12;
Fn.prototype.fun = function () {
    return '练习prototype';
};

/**
 * 对象fn之所有能调到name\age\fun属性是因为
 * 对象默认有一个隐藏属性__proto__指向创建fn对象的Fn函数prototype属性。
 */

var fn = new Fn();
console.log(fn.name);
console.log(fn.age);
console.log(fn.fun());
console.log(fn.__proto__);
console.log(Fn.prototype);


console.log('-----------------------------------');

function Fnn() {};

//在浏览器执行可以看出效果
var fnn = new Fnn();
console.log(Fnn.prototype); //Object函数构造的对象
console.log(fnn.__proto__); //Object函数构造的对象
console.log(fnn.__proto__.__proto__);   //Object函数构造对象的prototype对象
console.log(fnn.__proto__.__proto__.__proto__);   //Object函数构造对象的prototype对象的proto属性 = null
/**
 *  ======注意：prototype的值是对象======
 *
 *  函数没有给属性prototype赋值 ，那么prototype 默认指向Object 函数
 *  Object 函数中prototype 自定义了对象属性
 *  Object 实例化后对象属性__protot__指向Object函数prototype自定义的对象
 *
 *  自定义的对象属性__proto__值为null
 */
//undefined      fnn.prototype;
//返回函数代码    Fnn.__prototype__